package main

import "fmt"

// 模板方法模式就是将算法分解为一系列步骤，然后在一个模版方法中依次调用这些步骤。
// 这样客户端就不需要了解各个步骤的实现细节，只需要调用模版即可。

type PrintTemplate interface {
	Print(name string)
}
type template struct {
	isTemplate PrintTemplate
	name       string
}

func (t *template) Print() {
	t.isTemplate.Print(t.name)
}

type A struct{}

func (a *A) Print(name string) {
	fmt.Println("A:", name)
}

type B struct{}

func (b *B) Print(name string) {
	fmt.Println("B:", name)
}

func ExamplePrintTemplate() {
	templateA := &A{}
	template := &template{
		isTemplate: templateA,
		name:       "A",
	}
	template.Print()

	templateB := &B{}
	template.isTemplate = templateB
	template.Print()
}
